home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / MSDOS / s3.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  5KB  |  229 lines

  1. /* --------------------------------- grfast.c ------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* S3 accelerated line drawing (testing).
  8. */
  9.  
  10. #include "fly.h"
  11. #include "regs3.h"
  12.  
  13. #include <conio.h>
  14.  
  15. #define outb(p,n)        outp(p,n)
  16. #define outw(p,n)        outpw(p,n)
  17. #define inb(p)            inp(p)
  18. #define inw(p)            inpw(p)
  19.  
  20. #define WaitQueue16_32(n16,n32)    WaitQueue(n16)
  21. #define outw32(p,n)        outw(p,n)
  22.  
  23.  
  24. extern Ulong    FAR GrStats[2048];
  25. extern Ulong    FAR _BankSwitches;
  26.  
  27. static Uint    x1 = 0, y1 = 0, FirstTime = 1;
  28.  
  29. /* This segment is for testing the S3 accelerated line drawing.
  30.  *
  31.  * This code is lifted wholesale from XFree86-3.1.
  32. */
  33.  
  34. static void NEAR
  35. s3Unlock()
  36. {
  37.    unsigned char tmp;
  38.  
  39.    outb(vgaCRIndex, 0x38);
  40.    outb(vgaCRReg, 0x48);
  41.  
  42.    outb(vgaCRIndex, 0x31);
  43.    tmp = inb(vgaCRReg);
  44.    outb(vgaCRReg, tmp | 0x09);
  45.  
  46.    outb(vgaCRIndex, 0x39);
  47.    outb(vgaCRReg, 0xa5);
  48.  
  49.    outb(vgaCRIndex, 0x35);        /* select segment 0 */
  50.    tmp = inb(vgaCRReg);
  51.    outb(vgaCRReg, tmp & 0xf0);
  52.  
  53.    outb(vgaCRIndex, 0x51);
  54.    tmp = inb(vgaCRReg);
  55.    outb(vgaCRReg, (tmp & 0xf3));
  56.  
  57.    outb(vgaCRIndex, 0x11);        /* allow writting? */
  58.    outb(vgaCRReg, 0x00);
  59. }
  60.  
  61. static void NEAR
  62. s3InitEnvironment()
  63. {
  64. LogPrintf ("s3InitEnvironment> start (GO_STAT 0x%02x)\n", inb(GP_STAT));
  65.  /* Current mixes, src, foreground active */
  66.  
  67.    WaitQueue(6);
  68. LogPrintf ("s3InitEnvironment> WaitQueue(6) done \n");
  69.    outw(FRGD_MIX, FSS_FRGDCOL | MIX_SRC);
  70.    outw(BKGD_MIX, BSS_BKGDCOL | MIX_SRC);
  71.  
  72.  /* Clipping rectangle to full drawable space */
  73.    outw(MULTIFUNC_CNTL, SCISSORS_T | 0x000);
  74.    outw(MULTIFUNC_CNTL, SCISSORS_L | 0x000);
  75.    outw(MULTIFUNC_CNTL, SCISSORS_R | (1024-1));
  76.    outw(MULTIFUNC_CNTL, SCISSORS_B | ( 768-1));
  77.  
  78.  /* Enable writes to all planes and reset color compare */
  79.    WaitQueue16_32(2,3);
  80. LogPrintf ("s3InitEnvironment> WaitQueue16_32(2,3) done \n");
  81.    outw32(WRT_MASK, ~0);
  82.    outw(MULTIFUNC_CNTL, PIX_CNTL | 0x0000);
  83.  
  84.  /*
  85.   * Clear the display.  Need to set the color, origin, and size. Then draw.
  86.   */
  87.    WaitQueue16_32(6,7);
  88. LogPrintf ("s3InitEnvironment> WaitQueue16_32(6,7) done \n");
  89.    outw32(FRGD_COLOR, 1);
  90.    outw(CUR_X, 0);
  91.    outw(CUR_Y, 0);
  92.    outw(MAJ_AXIS_PCNT,  (1024-1));
  93.    outw(MULTIFUNC_CNTL, ( 768-1) | MIN_AXIS_PCNT);
  94.    outw(CMD, CMD_RECT | INC_Y | INC_X | DRAW | PLANAR | WRTDATA);
  95.  
  96.    WaitQueue16_32(4,6);
  97. LogPrintf ("s3InitEnvironment> WaitQueue16_32(4,6) done \n");
  98.  /* Reset current draw position */
  99.    outw(CUR_X, 0);
  100.    outw(CUR_Y, 0);
  101.  
  102.  /* Reset current colors, foreground is all on, background is 0. */
  103.    outw32(FRGD_COLOR, ~0);
  104.    outw32(BKGD_COLOR,  0);
  105. LogPrintf ("s3InitEnvironment> all done \n");
  106. }
  107.  
  108. static void NEAR
  109. s3Init()
  110. {
  111.     unsigned char    tmp;
  112.     int        i;
  113.  
  114.     FirstTime = 0;
  115.  
  116. LogPrintf ("s3Init> start \n");
  117.     s3Unlock ();
  118. LogPrintf ("s3Init> s3Unlock() done \n");
  119. #if 1
  120.     outw(ADVFUNC_CNTL, 0x0007);
  121.  
  122.     outb(0x3C4, 1);
  123.     tmp = inb(0x3C5);
  124.     outb(0x3C5, tmp | 0x20); /* blank the screen */
  125.     outb(DAC_MASK, 0);
  126.  
  127. /* Reset the 8514/A, and disable all interrupts.
  128. */
  129.     outw(SUBSYS_CNTL, GPCTRL_RESET | CHPTEST_NORMAL);
  130.     outw(SUBSYS_CNTL, GPCTRL_ENAB | CHPTEST_NORMAL);
  131.     i = inw(SUBSYS_STAT);
  132.  
  133.     outb(0x3C4, 1);
  134.     outb(0x3C5, tmp);        /* unblank the screen */
  135.     outb(DAC_MASK, 0xff);
  136. LogPrintf ("s3Init> init sequence done \n");
  137. #endif
  138.     s3InitEnvironment();
  139. LogPrintf ("s3Init> all done \n");
  140. }
  141.  
  142. extern void FAR
  143. GrfMoveS3 (int xx1, int yy1)
  144. {
  145.     x1 = xx1;
  146.     y1 = yy1;
  147. }
  148.  
  149. extern void FAR
  150. GrfDrawS3 (int x2, int y2, Uint c)
  151. {
  152.     int    adx;        /* abs values of dx and dy */
  153.     int    ady;
  154.     int    signdx;        /* sign of dx and dy */
  155.     int    signdy;
  156.     int    e, e1, e2;    /* bresenham error and increments */
  157.     int    len;        /* length of segment */
  158.     short    cmd = CMD_LINE | DRAW | PLANAR | WRTDATA | LASTPIX;
  159.     short    fix;
  160.  
  161.     if (FirstTime)
  162.         s3Init ();
  163.  
  164.     if ((adx = x2 - x1) < 0) {
  165.         adx = -adx;
  166.         signdx = -1;
  167.         fix = 0;
  168.     } else {
  169.         signdx = 1;
  170.         cmd |= INC_X;
  171.         fix = -1;
  172.     }
  173.     if ((ady = y2 - y1) < 0) {
  174.         ady = -ady;
  175.         signdy = -1;
  176.     } else {
  177.         signdy = 1;
  178.         cmd |= INC_Y;
  179.     }
  180.  
  181.     if (adx > ady) {
  182.         e1 = ady << 1;
  183.         e2 = e1 - (adx << 1);
  184.         e = e1 - adx;
  185.         len = adx;
  186.     } else {
  187.         e1 = adx << 1;
  188.         e2 = e1 - (ady << 1);
  189.         e = e1 - ady;
  190.         cmd |= YMAJAXIS;
  191.         len = ady;
  192.     }
  193.     ++GrStats[len];
  194.  
  195.     if (len) {
  196.          /*
  197.           * Here is a problem, the unwound error terms could be
  198.           * upto 16bit now. The poor S3 is only 12 or 13 bit.
  199.           * The rounding error is probably small I favor scaling
  200.           * the error terms, although re-evaluation is also an
  201.           * option I think it might give visable errors
  202.           * - Jon 12/9/93.
  203.           */
  204.  
  205.          if (abs(e) > 4096  || abs(e1) > 4096 || abs(e2) > 4096) {
  206.         int div;
  207.  
  208.         if (abs(e) > abs(e1))
  209.             div = (abs(e) > abs(e2)) ?
  210.             (abs(e) + 4095)/ 4096 : (abs(e2) + 4095)/ 4096;
  211.         else
  212.             div = (abs(e1) > abs(e2)) ?
  213.             (abs(e1) + 4095)/ 4096 : (abs(e2) + 4095)/ 4096;
  214.  
  215.         e  /= div;
  216.         e1 /= div;
  217.         e2 /= div;
  218.          }
  219.          WaitQueue(7);
  220.          S3_OUTW(CUR_X, (short)x1);
  221.          S3_OUTW(CUR_Y, (short)y1);
  222.          S3_OUTW(ERR_TERM, (short)(e + fix));
  223.          S3_OUTW(DESTY_AXSTP, (short)e1);
  224.          S3_OUTW(DESTX_DIASTP, (short)e2);
  225.          S3_OUTW(MAJ_AXIS_PCNT, (short)len);
  226.          S3_OUTW(CMD, cmd);
  227.     }
  228. }
  229.